#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 100

typedef struct Elemtype
{
    char data[MAX];
} Elemtype;

typedef struct Queue
{
    Elemtype data[MAX];
    int front, rear;
} Queue;

void init(Queue* q)
{
    q->front = -1;
    q->rear = -1;
}

int enqueue(Queue* q, Elemtype e)
{
    if ((q->rear + 1) % MAX == q->front) // 队列已满
    {
        printf("队列已满！\n");
        return -1; // 返回错误代码
    }
    q->rear = (q->rear + 1) % MAX;
    strcpy(q->data[q->rear].data, e.data);
    return 0; // 返回成功代码
}

void dequeue(Queue* q)
{
    if (q->front == q->rear) // 队列为空
    {
        printf("队列为空！\n");
    }
    else
    {
        printf("%s\n", q->data[q->front+1].data);
        q->front = (q->front + 1) % MAX;
    }
}

int empt(Queue* q)
{
    return q->front == q->rear; // 队列为空的条件
}
int repeat(Queue* q, Elemtype e)
{

    if (empt(q)) // 检查队列是否为空
    {
        return 1; // 如果为空，直接返回
    }int i = 0;
    Elemtype tempelem;
    for (; i < q->rear + 1; i++)
        if (strcmp(e.data, q->data[i].data) == 0)
            return 0;
    if (i == q->rear + 1) // 如果没有找到相等的元素，直接返回
        return 1;
}
void getword(Queue* q, char inp[])
{
    int i = 0, j = 0;
    Elemtype teminp;
    for (; inp[i] != '\0'; i++)
    {
        if (inp[i] >= 32 && inp[i] <= 47 || inp[i] >= 58 && inp[i] <= 64 || inp[i] >= 91 && inp[i] <= 96 || inp[i] >= 123 && inp[i] <= 126) // 判断是否为符号
        {
            teminp.data[j] = '\0';
            if (j > 0 && repeat(q, teminp)) // 确保不是空字符串才入队
                enqueue(q, teminp);
            j = 0;
        }
        else if ((inp[i] >= 'a' && inp[i] <= 'z') || (inp[i] >= 'A' && inp[i] <= 'Z'))
        {
            teminp.data[j] = inp[i];
            j++;
        }
        else
        {
            teminp.data[j] = '\0';
            j = 0;
        }
    }
    // 处理最后一个单词（如果有的话）
    if (j >= 0)
        enqueue(q, teminp);
    
}

/*void kmp(Queue q, char inp[])
{
    int i = 0, j = -1; // i 为当前匹配位置，j 为前缀后缀匹配位置
    while (i < strlen(inp))
    {
        if (j == -1 || strcmp(inp,q.data[j].data) != 0)
        {
            i++;
            j++;
        }
        else
        {
            j = q.data[j].data[0];
        }
        // 匹配成功
        if (q.data[j].data[0] == '\0')
        {
            printf("%s\n", q.data[j].data);
            i--; // 回溯
            j = j - 1;
        }
}
*/


int main()
{
    Queue q;
    init(&q);
    char inp[MAX];
    fgets(inp, MAX, stdin);
    getword(&q, inp);
    while (!empt(&q))
        dequeue(&q);
    return 0;
}